package com.bbcare.comm;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;

public class JsonToEnetityUtil {
	@SuppressWarnings("unchecked")
	public static <T> T jsonToObject(JSONObject json,Class<T> clazz) throws Exception{ 
		Field[] field = clazz.getDeclaredFields();//获取实体的所有属性
		Object obj = clazz.newInstance(); //实例化反射的对象，最后会将赋值后的对象返回
		for (int i = 0; i < field.length; i++) {//循环数据数组
			String name = field[i].getName(); // 获取属性的名字
			String jsonKey = name;
			if(jsonKey.equals("serialVersionUID")){
				continue;
			}
            name = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写，方便构造get，set方法
            String type = field[i].getGenericType().toString();
            Method m;
            if(type.equals("int")){
            	m = clazz.getDeclaredMethod("set"+name,int.class);//获取set方法，用于赋值
            	String value = ""+json.get(jsonKey);
                if(!StringUtils.isEmpty(value) && !"null".equals(value)){//判断json中获取的值是否为空
                	m.invoke(obj,Integer.parseInt(value));//调用set方法为该属性赋值
                }
            }else if(type.equals("double")){
            	m = clazz.getDeclaredMethod("set"+name,double.class);//获取set方法，用于赋值
            	String value = ""+json.get(jsonKey);
                if(!StringUtils.isEmpty(value) && !"null".equals(value)){//判断json中获取的值是否为空
                	m.invoke(obj,Double.parseDouble(value));//调用set方法为该属性赋值
                }
            }else{
            	m = clazz.getMethod("set"+name,String.class);//获取set方法，用于赋值
            	String value="" + json.get(jsonKey);//json中获取的值
                if(!StringUtils.isEmpty(value) && !"null".equals(value)){//判断json中获取的值是否为空
                	m.invoke(obj,value);//调用set方法为该属性赋值
                }
            }
            
		}
		return (T)obj;//返回对象
	}
}
